home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / book / Chap05 / Solar / Solar.c next >
Encoding:
C/C++ Source or Header  |  1999-08-31  |  3.6 KB  |  156 lines

  1. // Solar.c
  2. // OpenGL SuperBible, Chapter 5
  3. // Demonstrates OpenGL nested coordinate transformations
  4. // and perspective
  5. // Program by Richard S. Wright Jr.
  6.  
  7. #include <windows.h>
  8. #include <gl/gl.h>
  9. #include <gl/glu.h>
  10. #include <gl/glut.h>
  11. #include <math.h>
  12.  
  13.  
  14. // Lighting values
  15. GLfloat  whiteLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
  16. GLfloat  sourceLight[] = { 0.8f, 0.8f, 0.8f, 1.0f };
  17. GLfloat     lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
  18.  
  19.  
  20. // Called to draw scene
  21. void RenderScene(void)
  22.     {
  23.     // Earth and Moon angle of revolution
  24.     static float fMoonRot = 0.0f;
  25.     static float fEarthRot = 0.0f;
  26.  
  27.     // Clear the window with current clearing color
  28.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  29.  
  30.     // Save the matrix state and do the rotations
  31.     glMatrixMode(GL_MODELVIEW);
  32.     glPushMatrix();
  33.  
  34.     // Set light position before viewing transformation
  35.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
  36.  
  37.     // Translate the whole scene out and into view    
  38.     glTranslatef(0.0f, 0.0f, -300.0f);    
  39.     
  40.     // Set material color, Red
  41.     // Sun
  42.     glColor3ub(255, 255, 0);
  43.     glutSolidSphere(15.0f, 15, 15);
  44.  
  45.     // Move the light after we draw the sun!
  46.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
  47.  
  48.     // Rotate coordinate system
  49.     glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
  50.  
  51.     // Draw the Earth
  52.     glColor3ub(0,0,255);
  53.     glTranslatef(105.0f,0.0f,0.0f);
  54.     glutSolidSphere(15.0f, 15, 15);
  55.  
  56.  
  57.     // Rotate from Earth based coordinates and draw Moon
  58.     glColor3ub(200,200,200);
  59.     glRotatef(fMoonRot,0.0f, 1.0f, 0.0f);
  60.     glTranslatef(30.0f, 0.0f, 0.0f);
  61.     fMoonRot+= 15.0f;
  62.     if(fMoonRot > 360.0f)
  63.         fMoonRot = 0.0f;
  64.  
  65.     glutSolidSphere(6.0f, 15, 15);
  66.  
  67.     // Restore the matrix state
  68.     glPopMatrix();    // Modelview matrix
  69.  
  70.  
  71.     // Step earth orbit 5 degrees
  72.     fEarthRot += 5.0f;
  73.     if(fEarthRot > 360.0f)
  74.         fEarthRot = 0.0f;
  75.  
  76.     // Show the image
  77.     glutSwapBuffers();
  78.     }
  79.  
  80.  
  81. // This function does any needed initialization on the rendering
  82. // context. 
  83. void SetupRC()
  84.     {
  85.     // Light values and coordinates
  86.     glEnable(GL_DEPTH_TEST);    // Hidden surface removal
  87.     glFrontFace(GL_CCW);        // Counter clock-wise polygons face out
  88.     glEnable(GL_CULL_FACE);        // Do not calculate inside of jet
  89.  
  90.     // Enable lighting
  91.     glEnable(GL_LIGHTING);
  92.  
  93.     // Setup and enable light 0
  94.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT,whiteLight);
  95.     glLightfv(GL_LIGHT0,GL_DIFFUSE,sourceLight);
  96.     glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
  97.     glEnable(GL_LIGHT0);
  98.  
  99.     // Enable color tracking
  100.     glEnable(GL_COLOR_MATERIAL);
  101.     
  102.     // Set Material properties to follow glColor values
  103.     glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  104.  
  105.     // Black blue background
  106.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
  107.     }
  108.  
  109.  
  110. void TimerFunc(int value)
  111.     {
  112.     glutPostRedisplay();
  113.     glutTimerFunc(100, TimerFunc, 1);
  114.     }
  115.  
  116. void ChangeSize(int w, int h)
  117.     {
  118.     GLfloat fAspect;
  119.  
  120.     // Prevent a divide by zero
  121.     if(h == 0)
  122.         h = 1;
  123.  
  124.     // Set Viewport to window dimensions
  125.     glViewport(0, 0, w, h);
  126.  
  127.     // Calculate aspect ratio of the window
  128.     fAspect = (GLfloat)w/(GLfloat)h;
  129.  
  130.     // Set the perspective coordinate system
  131.     glMatrixMode(GL_PROJECTION);
  132.     glLoadIdentity();
  133.  
  134.     // field of view of 45 degrees, near and far planes 1.0 and 425
  135.     gluPerspective(45.0f, fAspect, 1.0, 425.0);
  136.  
  137.     // Modelview matrix reset
  138.     glMatrixMode(GL_MODELVIEW);
  139.     glLoadIdentity();
  140.        }
  141.  
  142.  
  143. int main(int argc, char* argv[])
  144.     {
  145.     glutInit(&argc, argv);
  146.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  147.     glutCreateWindow("Earth/Moon/Sun System");
  148.     glutReshapeFunc(ChangeSize);
  149.     glutDisplayFunc(RenderScene);
  150.     glutTimerFunc(500, TimerFunc, 1);
  151.     SetupRC();
  152.     glutMainLoop();
  153.  
  154.     return 0;
  155.     }
  156.